/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package model.handler;

import java.sql.SQLException;
import java.util.Date;
import java.util.LinkedList;
import model.dao.LoteSementeDAO;
import model.dto.LoteSementeDTO;
import model.exception.MissingIdException;
import model.exception.NoChangesOnUpdateException;
import model.exception.NotNullFieldsException;

/**
 *
 * @author Gabriel
 */
public class LoteSementeHandler {

    private LoteSementeDAO loteSementeDAO;

    public LoteSementeHandler() throws SQLException, ClassNotFoundException {
        loteSementeDAO = new LoteSementeDAO();
    }

    private void verificaCamposNotNullInsercao(LoteSementeDTO loteSementeDTO) throws NotNullFieldsException {
        if (loteSementeDTO.getIdColeta() == null) {
            throw new NotNullFieldsException("A Coleta de Origem é informação obrigatória de um Lote de Sementes");
        }
        if (loteSementeDTO.getDataColeta() == null) {
            throw new NotNullFieldsException("A Data de Coleta é informação obrigatória de um Lote de Sementes");
        }
        if (loteSementeDTO.getDataColeta() == null) {
            throw new NotNullFieldsException("O Peso Inicial é informação obrigatória de um Lote de Sementes");
        }
        if (loteSementeDTO.isFlgEncerrado() == null) {
            throw new NotNullFieldsException("O Flag de Lote Encerrado é informação obrigatória de um Lote de Sementes");
        }
    }

    private void verificaCamposNotNullAtualizacao(LoteSementeDTO loteSementeDTO, 
                                                  boolean atualizaIdColeta,
                                                  boolean atualizaPesoInicial) throws NotNullFieldsException {
        if ((loteSementeDTO.getIdColeta() == null) && atualizaIdColeta) {
            throw new NotNullFieldsException("A Data de Coleta é informação obrigatória de um Lote de Sementes");
        }
        if ((loteSementeDTO.getPesoInicial() == null) && atualizaPesoInicial) {
            throw new NotNullFieldsException("O Peso Inicial é informação obrigatória de um Lote de Sementes");
        }

    }

    public LinkedList<LoteSementeDTO> pesquisaLoteSemente(Integer id,
            Date dataColeta,
            Boolean flgEncerrado,
            Integer idMatriz,
            String nomeEspecie) throws SQLException {
        return loteSementeDAO.pesquisaLoteSemente(id, dataColeta, flgEncerrado, idMatriz, nomeEspecie);
    }

    public void cadastraLoteSemente(LoteSementeDTO loteSementeDTO) throws SQLException, NotNullFieldsException {
        verificaCamposNotNullInsercao(loteSementeDTO);
        loteSementeDAO.insereLoteSemente(loteSementeDTO);
    }

    public void atualizaLoteSemente(LoteSementeDTO loteSementeDTO,
            boolean atualizaIdColeta,
            boolean atualizaPesoInicial) throws MissingIdException, NotNullFieldsException, NoChangesOnUpdateException, SQLException {

        // Verifica se o identificador foi passado
        if (loteSementeDTO.getId() == null) {
            throw new MissingIdException();
        }

        verificaCamposNotNullAtualizacao(loteSementeDTO, atualizaIdColeta, atualizaPesoInicial);

        /* Verifica se existe atualização */
        if (!(atualizaIdColeta || atualizaPesoInicial)) {
            throw new NoChangesOnUpdateException();
        }

        // Invoca chamada à base
        loteSementeDAO.atualizaLoteSemente(loteSementeDTO, atualizaIdColeta, atualizaPesoInicial);
    }
}
